package org.my.spring.agent.mcp.playwright.service;

import com.alibaba.fastjson2.JSONObject;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.options.AriaRole;
import com.microsoft.playwright.options.LoadState;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.my.spring.agent.common.domain.Result;
import org.my.spring.agent.mcp.core.domain.dto.IntentResult;
import org.my.spring.agent.mcp.playwright.utils.AutoWebUtil;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;

import java.util.Arrays;

/**
 * Web自动化MCP服务类
 * 提供基于Playwright的浏览器自动化工具方法，支持页面导航、元素交互和内容提取
 * 所有方法均使用@Tool注解标记为AI可调用工具
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class AutoWebMcpService {

    /**
     * 浏览器页面导航工具
     * 根据命令中的URL导航到指定网页，默认导航至百度首页
     * 导航完成后等待网络进入空闲状态
     *
     * @param key 用户会话标识，用于获取对应的浏览器实例
     * @param command 导航命令，包含目标URL信息
     * @return 导航结果，成功时返回空字符串，失败时包含错误信息
     */
    @Tool(name = "navigate", description = "打开浏览器地址")
    public Result<String> navigate(String key, IntentResult.Command command) {
        log.info("navigate:{}", command);
        Page page = AutoWebUtil.getBrowserPage(key);
        String url = StringUtils.isBlank(command.url()) ? "https://www.baidu.com" : command.url();
        page.navigate(url);
        page.waitForLoadState(LoadState.NETWORKIDLE);
        return Result.success();
    }

    /**
     * 页面元素点击工具
     * 根据元素ID或名称定位并点击页面元素
     * 优先使用inputId定位，若不存在则使用inputName通过aria角色定位
     *
     * @param key 用户会话标识，用于获取对应的浏览器实例
     * @param command 点击命令，包含元素定位信息(inputId或inputName)
     * @return 点击操作结果，成功时返回空字符串，失败时包含错误信息
     */
    @Tool(name = "clickElement", description = "点击元素")
    public Result<String> clickElement(String key, IntentResult.Command command) {
        log.info("clickElement:{}", command);
        Page page = AutoWebUtil.getBrowserPage(key);
        if (StringUtils.isNotBlank(command.inputId())) {
            page.click("#" + command.inputId());
        } else {
            page.getByRole(AriaRole.TEXTBOX, new Page.GetByRoleOptions().setName(command.inputName())).click();
        }
        return Result.success();
    }

    /**
     * 文本输入工具
     * 根据元素ID或名称定位并输入文本内容
     * 优先使用inputId定位，若不存在则使用inputName通过aria角色定位
     *
     * @param key 用户会话标识，用于获取对应的浏览器实例
     * @param command 输入命令，包含元素定位信息和输入值(inputValue)
     * @return 输入操作结果，成功时返回空字符串，失败时包含错误信息
     */
    @Tool(name = "inputText", description = "输入元素值")
    public Result<String> inputText(String key, IntentResult.Command command) {
        log.info("inputText:{}", command);
        Page page = AutoWebUtil.getBrowserPage(key);
        if (StringUtils.isNotBlank(command.inputId())) {
            page.fill("#" + command.inputId(), command.inputValue());
        } else {
            page.getByRole(AriaRole.TEXTBOX, new Page.GetByRoleOptions().setName(command.inputName())).fill(command.inputValue());
        }
        return Result.success();
    }

    /**
     * 页面内容提取工具
     * 从百度搜索结果区域(#content_left)提取文本内容并格式化输出
     * 等待搜索结果加载完成后，提取所有c-container类元素的文本
     *
     * @param key 用户会话标识，用于获取对应的浏览器实例
     * @param command 输出命令(当前未使用具体参数)
     * @return 提取结果，成功时返回格式化的搜索结果文本，失败时包含错误信息
     */
    @Tool(name = "outputStr", description = "输出内容")
    public Result<String> outputStr(String key, IntentResult.Command command) {
        log.info("outputStr:{}", command);
        Page page = AutoWebUtil.getBrowserPage(key);
        page.waitForSelector("#content_left");
        log.info("百度搜索结果");
        return Result.success(String.join("<br>",
                (page.locator("#content_left").
                        locator("div.c-container").
                        allTextContents())).replaceAll("\uE734\uE610", ""));
    }
}
